package dletc.demo;

public class demo06 {

	public static void main(String[] args) {
		/**
		 * 思考：我们在实际开发中，如果需要进行字符串频繁的拼接，会有什么问题？
		 * 		答：因为java中字符串是不可变的，每一次拼接都会产生新字符串，
		 * 		       这样会占用大量的方法区内存，造成内存空间的浪费。
		 * 
		 * StringBuffer: StringBuffer底层实际上是一个byte[]数组，初始化容量是16
		 * 
		 * 如何优化StringBuffer的性能：
		 * 		在创建StringBuffer的时候尽可能给定一个初始化容量 
		 * 		最好减少底层数组的扩容次数，预估一下，给一个大一些初始化容量。
		 * 		怎么给一个大一些的初始化容量 new对象时，直接给容量长度	 StringBuffer s = new StringBuffer(1000);
		 * 	
		 */
		
		/**
		 * StringBuilder和StringBuffer的区别：
		 * 		StringBuffer是线程安全的 ，效率比Builder低，有synchronized关键字
		 * 		StringBuilder是非线程安全的，效率高。
		 * StringBuffer和StringBuilder为什么可变：
		 * 		我看过源代码，StringBuffer/StringBuilder内部实际上是一个byte[]数组
		 * 		这个byte[]数组没有被final修饰，StringBuffer/StringBuilder的初始化
		 * 		容量我记得是16(无参构造是默认16，有参构造是 输入的字符串长度 + 16)，当存满之后会进行扩容，
		 * 		底层调用了数组拷贝的方法System.arraycopy()...是这样扩容的，扩容结果是原来数组长度的**2倍再加2** ，所以可变。
		 */
		
		//底层为初始化容量16的byte[]数组，（字符串缓冲区）
		StringBuffer s = new StringBuffer();

		//拼接字符串，以后统一调用append()方法。
		//append是追加的意思，进行追加时如果byte数组满了会自动扩容。
		s.append("a");
		s.append(true);
		s.append(97);
		s.append(3.14);
		s.append(3);
		
		System.out.println(s);
		
		

	}

}
